#include "../include/logger.h"
#include <iostream>
#include <ctime>
#include <iomanip>
#include <sstream>

// 获取单例实例
Logger& Logger::getInstance() {
    static Logger instance;
    return instance;
}

// 构造函数
Logger::Logger() : m_level(LogLevel::INFO), m_logToFile(false) {
}

// 析构函数
Logger::~Logger() {
    if (m_logFile.is_open()) {
        m_logFile.close();
    }
}

// 设置日志级别
void Logger::setLevel(LogLevel level) {
    m_level = level;
}

// 设置日志文件
bool Logger::setLogToFile(const std::string& filename) {
    std::lock_guard<std::mutex> lock(m_mutex);
    
    if (m_logFile.is_open()) {
        m_logFile.close();
    }
    
    m_logFile.open(filename, std::ios::app);
    if (!m_logFile.is_open()) {
        // 无法打开日志文件，但不输出错误到控制台
        m_logToFile = false;
        return false;
    }
    
    m_logToFile = true;
    return true;
}

// 写入日志
void Logger::log(LogLevel level, const std::string& message, const char* file, int line) {
    if (level < m_level) {
        return;
    }
    
    // 获取当前时间
    auto now = std::chrono::system_clock::now();
    auto time = std::chrono::system_clock::to_time_t(now);
    auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
        now.time_since_epoch()) % 1000;
    
    // 格式化日志消息
    std::stringstream ss;
    ss << std::put_time(std::localtime(&time), "%Y-%m-%d %H:%M:%S")
       << '.' << std::setfill('0') << std::setw(3) << ms.count()
       << " [" << levelToString(level) << "]";
    
    // 添加文件和行号信息
    if (file && line > 0) {
        ss << " [" << file << ":" << line << "]";
    }
    
    // 添加消息
    ss << " " << message;
    
    // 只输出到文件
    std::lock_guard<std::mutex> lock(m_mutex);
    
    if (m_logToFile && m_logFile.is_open()) {
        m_logFile << ss.str() << std::endl;
    }
}

// 写入调试日志
void Logger::debug(const std::string& message, const char* file, int line) {
    log(LogLevel::DEBUG_LEVEL, message, file, line);
}

// 写入信息日志
void Logger::info(const std::string& message, const char* file, int line) {
    log(LogLevel::INFO, message, file, line);
}

// 写入警告日志
void Logger::warning(const std::string& message, const char* file, int line) {
    log(LogLevel::WARNING, message, file, line);
}

// 写入错误日志
void Logger::error(const std::string& message, const char* file, int line) {
    log(LogLevel::ERROR, message, file, line);
}

// 写入致命错误日志
void Logger::fatal(const std::string& message, const char* file, int line) {
    log(LogLevel::FATAL, message, file, line);
}

// 将日志级别转换为字符串
std::string Logger::levelToString(LogLevel level) {
    switch (level) {
        case LogLevel::DEBUG_LEVEL: return "调试";
        case LogLevel::INFO:        return "信息";
        case LogLevel::WARNING:     return "警告";
        case LogLevel::ERROR:       return "错误";
        case LogLevel::FATAL:       return "致命";
        default:                    return "未知";
    }
} 